package Client;

import java.io.Serializable;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;

import javax.security.auth.login.LoginException;

import Graphique.MainGraphique;
import Serveur.InterfaceClient;
import Serveur.InterfacePrivee;
import Serveur.InterfacePublic;
import Serveur.Twouit;
import Serveur.Utilisateur;

public class Client extends UnicastRemoteObject implements Serializable, Serveur.InterfaceClient{
	private static final long serialVersionUID = 1L;
	private InterfacePublic ipub = null; // ipub est un stub vers l objet remote, obtenu par le lookup
	private InterfacePrivee ipriv = null;
	private Utilisateur u;
	
	private ArrayList<Twouit> listeTwouit; //Liste des twouits d'un utilisateur
	
	protected Client() throws RemoteException {
		super();
		u = new Utilisateur();
		System.out.println("Recherche d'un objet serveur");
		try {
			if (System.getSecurityManager() == null) {
				System.setSecurityManager(new java.rmi.RMISecurityManager());
			}
			ipub = (InterfacePublic) Naming.lookup("rmi://localhost:" + 2004 + "/Serveur"); 
				// rechercher sur cette machine, localhost, un objet remote offrant un service de connexion 
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (RemoteException e) {
			e.printStackTrace();
		} catch (NotBoundException e) {
			e.printStackTrace();
		}
		listeTwouit = new ArrayList<Twouit>();
	}
	
	public static void main(String[] args){
		Client c = null;
		try {
			c = new Client();
			new MainGraphique(c);
		} catch (RemoteException e1) {
			e1.printStackTrace();
		}
		
	}
	
	public void connexion(String login, String pwd) throws RemoteException, LoginException{
		try {
				u.setLoginPwd(login, pwd);
				ipriv = ipub.logon(this,login, pwd);
				this.addToUSer();
			} 
		catch (RemoteException e) {
			System.out.println("Erreur de connexion");
			e.printStackTrace();
		}
	}
	//Lance le processus d'inscription
	public void incription(Utilisateur u) throws RemoteException{
		ipub.inscription(u);
	}
	//Ajoute l'utilisateur courant à la liste des fauxlover(Chaque utilisateur peut etre suivi)
	public void addToUSer() throws RemoteException{
		ipriv.addToListeFauxlover(this);
	}
	//Renvoie la liste des dernier twouit d'un utilisateur
	public ArrayList<Twouit> getDerniersTwouitUtilisateur(String utilisateur) throws RemoteException{
		return ipub.getDerniersTwouitUtilisateur(utilisateur);
	}
	//Renvoie la liste des dernier twouit en fonction d'un topic précis
	public ArrayList<Twouit> getDerniersTwouitTopic(String topic) throws RemoteException{
		return ipub.getDerniersTwouitTopic(topic);
	}
	//Renvoie la liste des topics
	public ArrayList<String> getListeTopics() throws RemoteException{
		return ipub.getListeTopics();
	}
	//Renvoie la liste des utilisateurs connectés
	public ArrayList<Utilisateur> getListeUtilisateurs() throws RemoteException{
		return ipub.getListeUtilisateurs();
	}
	//Renvoie tous les twouit
	public ArrayList<Twouit> getListeTwouit() throws RemoteException{
		return listeTwouit;
	}
	//Ajoute un twouit a la liste des twouit
	public void setListeTwouit(Twouit newTwouit) throws RemoteException{
		listeTwouit.add(newTwouit);
	}
	//Renvoie la liste des faux lovers d'un utilisateur precis
	public ArrayList<InterfaceClient> getFauxlovers(Client c) throws RemoteException{
		return ipriv.getFauxlovers(c);
	}
	//Renvoie l'utilisateur courant
	public Utilisateur getUtilisateur() throws RemoteException{
		return u;
	}
	//Lance le processus pour twouitter
	public void twouitter(Twouit t) throws RemoteException{
		ipriv.twouitter(t, this);
	}
	//Lance le processus pour faux lover quelqu'un
	public void fauxlover(String login) throws RemoteException{
		ipriv.addFauxlover(this, login);
	}
	//Lance le processus pour se deconnecter
	public void seDeconnecter() throws RemoteException{
		ipriv.seDeconnecter(this);
	}
	//Permet de retwouitter
	public void retwouitter(Twouit t) throws RemoteException{
		ipriv.retwouitter(this, t);
	}
	
}
